package com.bp.api.user;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

import javax.servlet.http.HttpServletRequest;

import com.common.enums.CommonCode;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import com.alibaba.fastjson.JSONObject;
import com.bp.vo.UserVO;
import com.common.enums.SystemStatusEnum;
import com.common.enums.ValidateCodeEnum;
import com.common.utils.CheckPhone;
import com.common.utils.IpUtil;
import com.common.utils.MD5Util;
import com.common.utils.ResourceUtil;
import com.common.utils.SendSmsUtil;
import com.common.utils.UploadUtil;
import com.idp.biz.bpsms.entity.BpSms;
import com.idp.biz.bpsms.service.BpSmsService;
import com.idp.biz.bpuser.entity.BpUser;
import com.idp.biz.bpuser.service.BpUserService;
import com.idp.web.bp.controller.BpUserController;

@CrossOrigin
@RestController
@RequestMapping(value = "/api/user/", method = RequestMethod.POST)
public class UserController {
	private static Logger logger = LoggerFactory.getLogger(BpUserController.class); 

	@Autowired
	private BpUserService userService;
	@Autowired
	private BpSmsService smsService;

	@Autowired
	private StringRedisTemplate redis;

	/**
	 * 验证手机号是否已被注册
	 * @param request
	 * @return
	 */
	@CrossOrigin
	@RequestMapping("/phoneIsEmpty")
	public String phoneIsEmpty(HttpServletRequest request) {
		JSONObject json = new JSONObject();
		try {
			String phone = request.getParameter("phone");
			if(StringUtils.isEmpty(phone)){
				json.put("code", SystemStatusEnum.PARAMETER_CANNOT_BE_EMPTY.getValue());
				json.put("message", SystemStatusEnum.PARAMETER_CANNOT_BE_EMPTY.getName());
				return json.toString();
			}
			if (CheckPhone.isLegal(phone)) {
				if (phoneIsEmpty(phone)) {
					json.put("code", SystemStatusEnum.PHONE_NUMBER_ALREADY_EXISTS.getValue());
					json.put("message", SystemStatusEnum.PHONE_NUMBER_ALREADY_EXISTS.getName());
					return json.toString();
				}
			} else {
				json.put("code", SystemStatusEnum.INCORRECT_PHONE_NUMBER_FORMAT.getValue());
				json.put("message", SystemStatusEnum.INCORRECT_PHONE_NUMBER_FORMAT.getName());
				return json.toString();
			}
			json.put("code", SystemStatusEnum.SUCCESS.getValue());
			json.put("message", SystemStatusEnum.SUCCESS.getName());
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			json.put("code", SystemStatusEnum.SERVERERROR.getValue());
			json.put("message", SystemStatusEnum.SERVERERROR.getName());
		}
		return json.toString();
	}
	
	/**
	 * 获取验证码
	 */
	@CrossOrigin
	@RequestMapping("/getValidateCode")
	public String getValidateCode(HttpServletRequest request) {
		JSONObject json = new JSONObject();
		try {
			String type = request.getParameter("type");
			String phone = request.getParameter("phone");
			if(StringUtils.isEmpty(type) || StringUtils.isEmpty(phone)){
				logger.info(new StringBuffer().append("UserController getValidateCode type is ").append(type).append(", phone is ").append(phone).toString());
				json.put("code", SystemStatusEnum.PARAMETER_CANNOT_BE_EMPTY.getValue());
				json.put("message", SystemStatusEnum.PARAMETER_CANNOT_BE_EMPTY.getName());
				return json.toString();
			}
			if(Integer.parseInt(type)==ValidateCodeEnum.REGISTER.getValue()){
				if (phoneIsEmpty(phone)) {
					json.put("code", SystemStatusEnum.PHONE_NUMBER_ALREADY_EXISTS.getValue());
					json.put("message", SystemStatusEnum.PHONE_NUMBER_ALREADY_EXISTS.getName());
					return json.toString();
				}
			} else if(Integer.parseInt(type)==ValidateCodeEnum.LOGIN.getValue() || Integer.parseInt(type)==ValidateCodeEnum.PWDRESET.getValue()){
				if (!phoneIsEmpty(phone)) {
					json.put("code", SystemStatusEnum.USER_IS_NULL.getValue());
					json.put("message", SystemStatusEnum.USER_IS_NULL.getName());
					return json.toString();

				}
			} else if(Integer.parseInt(type)==ValidateCodeEnum.PIN_HOUSEHOLDS.getValue()){
				json.put("code", SystemStatusEnum.USER_IS_NULL.getValue());
				json.put("message", SystemStatusEnum.USER_IS_NULL.getName());
				return json.toString();
			}
			
//			BpSms sms = new BpSms();
//			sms.setPhone(phone);
//			sms.setSendTime(new Date());
//			List<BpSms> smsList = smsService.findBySearch(sms);//获得当天短信发送条数 限制10条
//			if(smsList.size()>=10){
//				json.put("code", SystemStatusEnum.VALIDATECODE_LIMITED.getValue());
//				json.put("message", SystemStatusEnum.VALIDATECODE_LIMITED.getName());
//			} else
			if (CheckPhone.isLegal(phone)) {
				if(sendSMS(type, phone)){
					json.put("code", SystemStatusEnum.SUCCESS.getValue());
					json.put("message", SystemStatusEnum.SUCCESS.getName());
				} else {
					json.put("code", SystemStatusEnum.FAIL.getValue());
					json.put("message", "发送失败");
				}
				return json.toString();
			} else {
				json.put("code", SystemStatusEnum.INCORRECT_PHONE_NUMBER_FORMAT.getValue());
				json.put("message", SystemStatusEnum.INCORRECT_PHONE_NUMBER_FORMAT.getName());
			}
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			json.put("code", SystemStatusEnum.SERVERERROR.getValue());
			json.put("message", SystemStatusEnum.SERVERERROR.getName());
		}
		return json.toString();
	}
	
	/**
	 * 用户注册
	 */
	@CrossOrigin
	@RequestMapping("/regist")
	public String regist(HttpServletRequest request){
		JSONObject json = new JSONObject();
		try {
			String validateCode = request.getParameter("validateCode");//验证码
			String phone = request.getParameter("phone");//手机号
			String registerType = request.getParameter("registerType");//注册类型
			String deviceName = request.getParameter("deviceName");//注册设备
			String address = request.getParameter("address");//注册地点
			if(StringUtils.isEmpty(validateCode) || StringUtils.isEmpty(phone)){
				json.put("code", SystemStatusEnum.PARAMETER_CANNOT_BE_EMPTY.getValue());
				json.put("message", SystemStatusEnum.PARAMETER_CANNOT_BE_EMPTY.getName());
				return json.toString();
			}
			if (CheckPhone.isChinaMobilePhoneNum(phone) || CheckPhone.isChinaUnicomPhoneNum(phone) || CheckPhone.isChinaTelecomPhoneNum(phone)) {
				// 以“业务类型-手机号码-验证码”形式
				String validate = redis.opsForValue().get(ValidateCodeEnum.REGISTER.getValue()+"-"+phone+"-"+validateCode);
				if(StringUtils.isNotEmpty(validate) && validate.equals(validateCode)){
					if (phoneIsEmpty(phone)) {
						json.put("code", SystemStatusEnum.PHONE_NUMBER_ALREADY_EXISTS.getValue());
						json.put("message", SystemStatusEnum.PHONE_NUMBER_ALREADY_EXISTS.getName());
					} else {
						String token = MD5Util.getMD5(phone+new Date().getTime());
						BpUser user = new BpUser();
						user.setId(ResourceUtil.getUUID());//用户id
//						user.setUserPhoto("");//用户头像
//						user.setUserName("");//用户名
//						user.setNickName("");//昵称
						user.setPhone(phone);//手机号码
						user.setPassword(MD5Util.MD5(phone.substring(5, 11)));//登录初始密码为手机号后6位数
//						user.setEmail("");//电子邮箱
//						user.setName("");//姓名
//						user.setSex("");//性别
//						user.setBirthday("");//出生日期
//						user.setCountry("");//国家
//						user.setProvince("");//省
//						user.setCity("");//市
//						user.setCounty("");//区县
//						user.setAddress("");//地址
						user.setUserType(CommonCode.USER_TYPE_IS_ORDINARY.getValue());//用户类型
						user.setUserStatus(CommonCode.USER_STATUS_IS_NORMAL.getValue());//用户状态
						user.setRegisterType(registerType);//注册类型 0管理员注册 1安卓系统注册 2IOS系统注册
//						user.setRegisterInvitationCode("");//注册邀请码
						user.setRegisterTime(new Date());//注册时间
						user.setRegisterDevice(deviceName);//注册设备
						String ip = IpUtil.getIpAddr(request);
						user.setRegisterIp(IpUtil.getMACAddress()+"|"+ip+"|"+address);//注册mac地址+ip地址+GPS地点
//						user.setFirstLoginTime("");//首次登录时间
//						user.setFirstLoginAddress("");//首次登录地点
//						user.setFirstLoginIp("");//首次登录ip
//						user.setLastLoginTime("");//上一次登录时间
//						user.setLastLoginAddress("");//上一次登录地点
//						user.setLastLoginIp("");//上一次登录ip
//						user.setFinalLoginTime("");//最后登录时间
//						user.setFinalLoginAddress("");//最后登录地点
//						user.setFinalLoginIp(ip);//最后登录ip
						user.setToken(token);//保持登录
//						user.setBannedReason("");//封禁理由
//						user.setBannedTime("");//封禁时间
//						user.setDeblockingReason("");//解封理由
//						user.setDeblockingTime("");//解封时间
						user.setSymbol(CommonCode.Y.getValue());//数据有效性
//						user.setRemarks("");//备注说明
						
						userService.add(user);
						json.put("data", getUserVO(user));
						json.put("code", SystemStatusEnum.SUCCESS.getValue());
						json.put("message", "注册"+SystemStatusEnum.SUCCESS.getName());
						redis.delete(ValidateCodeEnum.REGISTER.getValue()+"-"+phone+"-"+validateCode);//删除验证码缓存
						// 保持登录
						redis.opsForValue().set(token, token, 604800, TimeUnit.MINUTES);//token一周有效，超时自动清空
						return json.toString();
					}
				} else {
					json.put("code", SystemStatusEnum.VALIDATECODE_ERROR.getValue());
					json.put("message", SystemStatusEnum.VALIDATECODE_ERROR.getName());
				}
			} else {
				json.put("code", SystemStatusEnum.INCORRECT_PHONE_NUMBER_FORMAT.getValue());
				json.put("message", SystemStatusEnum.INCORRECT_PHONE_NUMBER_FORMAT.getName());
			}
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			json.put("code", SystemStatusEnum.SERVERERROR.getValue());
			json.put("message", SystemStatusEnum.SERVERERROR.getName());
		}
		return json.toString();
	}
	
	/**
	 * 用户登录
	 */
	@CrossOrigin
	@RequestMapping("/login")
	public String login(HttpServletRequest request){
		JSONObject json = new JSONObject();
		try {
			String phone = request.getParameter("phone");//手机号
			String userName = request.getParameter("userName");//用户名
			String password = request.getParameter("password");//密码
			String validateCode = request.getParameter("validateCode");//验证码
			
			String deviceName = request.getParameter("deviceName");//设备名称
			String address = request.getParameter("address");//登录地点
			if((StringUtils.isEmpty(phone) && StringUtils.isEmpty(userName)) || (StringUtils.isEmpty(password) && StringUtils.isEmpty(validateCode))){
				json.put("code", SystemStatusEnum.PARAMETER_CANNOT_BE_EMPTY.getValue());
				json.put("message", SystemStatusEnum.PARAMETER_CANNOT_BE_EMPTY.getName());
				return json.toString();
			}
			
			BpUser bpUser = new BpUser();
			bpUser.setPhone(phone);
			if(StringUtils.isNotEmpty(userName)){
				bpUser.setUserName(userName);
			}
			if(StringUtils.isNotEmpty(password)){
				bpUser.setPassword(password);
			}
			if(StringUtils.isNotEmpty(validateCode)){
				// 以“业务类型-手机号码-验证码”形式
				String validate = redis.opsForValue().get(ValidateCodeEnum.LOGIN.getValue()+"-"+phone+"-"+validateCode);
				if(StringUtils.isEmpty(validate) || !validateCode.equals(validate)){
					json.put("code", SystemStatusEnum.VALIDATECODE_ERROR.getValue());
					json.put("message", SystemStatusEnum.VALIDATECODE_ERROR.getName());
					return json.toJSONString();
				}
				redis.delete(ValidateCodeEnum.LOGIN.getValue()+"-"+phone+"-"+validateCode);//删除登录验证码缓存
			}
			List<BpUser> userList = userService.findBySearch(bpUser);
			if(userList!=null && userList.size()>0){
				String token = MD5Util.getMD5(phone+new Date().getTime());
				BpUser user = userList.get(0);
				if(user.getUserStatus().equals(CommonCode.USER_STATUS_IS_CANCELLATION.getValue())){
					json.put("code", SystemStatusEnum.ACCOUNT_IS_CANCELLATION.getValue());
					json.put("message", SystemStatusEnum.ACCOUNT_IS_CANCELLATION.getName());
					return json.toJSONString();
				}
				if(user.getUserStatus().equals(CommonCode.USER_STATUS_IS_BANNED.getValue())){
					json.put("code", SystemStatusEnum.USER_IS_BANNED.getValue());
					json.put("message", SystemStatusEnum.USER_IS_BANNED.getName());
					return json.toJSONString();
				}
				
				if(password != null && !password.equals(user.getPassword())){
					json.put("code", SystemStatusEnum.LOGIN_ERROR.getValue());
					json.put("message", SystemStatusEnum.LOGIN_ERROR.getName());
					return json.toString();
				}
				if(user.getFirstLoginTime() == null && user.getFirstLoginIp() == null && user.getFirstLoginAddress() == null){
					//设置首次登录信息
					user.setFirstLoginTime(new Date());//首次登录时间
					user.setFirstLoginAddress(address+"|"+deviceName);//首次登录地点|设备名称
					user.setFirstLoginIp(IpUtil.getIpAddr(request));//首次登录ip
				}
				//设置上次登录信息
				user.setLastLoginTime(user.getFinalLoginTime());
				user.setLastLoginIp(user.getFinalLoginIp());
				user.setLastLoginAddress(user.getFinalLoginAddress());
				//录入本次登录信息
				user.setFinalLoginTime(new Date());
				user.setFinalLoginAddress(address+"|"+deviceName);
				user.setFinalLoginIp(IpUtil.getIpAddr(request));
				user.setToken(token);
				
				userService.update(user);
				
				json.put("data", getUserVO(user));
				json.put("code", SystemStatusEnum.SUCCESS.getValue());
				json.put("message", "登录"+SystemStatusEnum.SUCCESS.getName());
				// 保持登录
				redis.opsForValue().set(token, token, 604800, TimeUnit.MINUTES);//token一周有效，超时自动清空
				return json.toString();
			} else {
				json.put("code", SystemStatusEnum.USER_IS_NULL.getValue());
				json.put("message", SystemStatusEnum.USER_IS_NULL.getName());
			}
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			json.put("code", SystemStatusEnum.SERVERERROR.getValue());
			json.put("message", SystemStatusEnum.SERVERERROR.getName());
		}
		return json.toString();
	}
	
	/**
	 * 刷新token
	 */
	@CrossOrigin
	@RequestMapping("/refreshToken")
	public String refreshToken(HttpServletRequest request) {
		JSONObject json = new JSONObject();
		try {
			String token = request.getParameter("token");
			if(StringUtils.isEmpty(token)){
				json.put("code", SystemStatusEnum.PARAMETER_CANNOT_BE_EMPTY.getValue());
				json.put("message", SystemStatusEnum.PARAMETER_CANNOT_BE_EMPTY.getName());
				return json.toString();
			}
			BpUser user = userService.getByToken(token);
			if(user!=null){
				String newToken = MD5Util.getMD5(user.getPhone()+new Date().getTime());
				user.setToken(newToken);
				userService.update(user);
				
				//清空token缓存
				redis.delete(token);
				//写入新token
				redis.opsForValue().set(newToken, newToken, 604800, TimeUnit.MINUTES);//token一周有效，超时自动清空
				
				json.put("data", newToken);
				json.put("code", SystemStatusEnum.SUCCESS.getValue());
				json.put("message", SystemStatusEnum.SUCCESS.getName());
				return json.toString();
			} else {
				json.put("code", SystemStatusEnum.TOKEN_FAILURE.getValue());
				json.put("message", SystemStatusEnum.TOKEN_FAILURE.getName());
			}
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			json.put("code", SystemStatusEnum.SERVERERROR.getValue());
			json.put("message", SystemStatusEnum.SERVERERROR.getName());
		}
		return json.toString();
	}
	
	/**
	 * 退出登录
	 */
	@CrossOrigin
	@RequestMapping("/loginOut")
	public String loginOut(HttpServletRequest request){
		JSONObject json = new JSONObject();
		try {
			String token = request.getParameter("token");//用户登录标识
			if(StringUtils.isEmpty(token)) {
				json.put("code", SystemStatusEnum.PARAMETER_CANNOT_BE_EMPTY.getValue());
				json.put("message", SystemStatusEnum.PARAMETER_CANNOT_BE_EMPTY.getName());
				return json.toString();
			}
			String isLogin = redis.opsForValue().get(token);
			if(StringUtils.isEmpty(isLogin)){
				json.put("code", SystemStatusEnum.TOKEN_FAILURE.getValue());
				json.put("message", SystemStatusEnum.TOKEN_FAILURE.getName());
				return json.toString();
			}
			BpUser user = userService.getByToken(token);
			if(user==null){
				json.put("code", SystemStatusEnum.NOTLOGIN.getValue());
				json.put("message", SystemStatusEnum.NOTLOGIN.getName());
				return json.toString();
			}
			user.setToken("0");
			userService.update(user);
			
			json.put("code", SystemStatusEnum.SUCCESS.getValue());
			json.put("message", SystemStatusEnum.SUCCESS.getName());
			//清空token缓存
			redis.delete(token);
			return json.toString();
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			json.put("code", SystemStatusEnum.SERVERERROR.getValue());
			json.put("message", SystemStatusEnum.SERVERERROR.getName());
		}
		return json.toString();
	}
	
	/**
	 * 上传头像
	 */
	@RequestMapping("/uploadPhoto")
	public String uploadPhoto(@RequestParam("photo") MultipartFile photo, HttpServletRequest request) {
		JSONObject json = new JSONObject();
		String token = request.getParameter("token");
		if (request instanceof MultipartHttpServletRequest) {
			// 参数校验
			if (StringUtils.isEmpty(token)) {
				logger.info(new StringBuffer().append("UserController updateUser token is ").append(token).toString());
				json.put("code", SystemStatusEnum.TOKEN_FAILURE.getValue());
				json.put("message", SystemStatusEnum.TOKEN_FAILURE.getName());
				return json.toString();
			}
			String isLogin = redis.opsForValue().get(token);
			if(StringUtils.isEmpty(isLogin)){
				json.put("code", SystemStatusEnum.TOKEN_FAILURE.getValue());
				json.put("message", SystemStatusEnum.TOKEN_FAILURE.getName());
				return json.toString();
			}
			// 文件命名
			String originalFilename = photo.getOriginalFilename();
			// 获取文件的后缀名
			String extendName = originalFilename.substring(originalFilename.lastIndexOf("."), originalFilename.length());

			// 判断文件是否是图片
			String[] imagType = { ".jpg", ".png", ".bmp", ".gif" };
			List<String> imageTyepLists = Arrays.asList(imagType);
			if (imageTyepLists.contains(extendName)) {
				// 用户头像
				BpUser user = userService.getByToken(token);
				if (user == null) {
					json.put("code", SystemStatusEnum.TOKEN_FAILURE.getValue());
					json.put("message", SystemStatusEnum.TOKEN_FAILURE.getName());
					return json.toJSONString();
				}
				String imagePath = "";
				try {
					imagePath = UploadUtil.uploadImage(photo);
				} catch (IllegalStateException e) {
					e.printStackTrace();
					json.put("code", SystemStatusEnum.IMAGES_FORMAT_IS_ERROE.getValue());
					json.put("message", SystemStatusEnum.IMAGES_FORMAT_IS_ERROE.getName());
					return json.toString();
				} catch (IOException e) {
					e.printStackTrace();
					json.put("code", SystemStatusEnum.IMAGES_FORMAT_IS_ERROE.getValue());
					json.put("message", SystemStatusEnum.IMAGES_FORMAT_IS_ERROE.getName());
					return json.toString();
				}
				user.setUserPhoto(imagePath);
				userService.update(user);

				json.put("data", imagePath);
				json.put("code", SystemStatusEnum.SUCCESS.getValue());
				json.put("message", "上传" + SystemStatusEnum.SUCCESS.getName());
				return json.toString();
			} else {
				json.put("code", SystemStatusEnum.IMAGES_FORMAT_IS_ERROE.getValue());
				json.put("message", SystemStatusEnum.IMAGES_FORMAT_IS_ERROE.getName());
			}
		}
		return json.toString();
	}
	
	/**
	 * 修改用户信息
	 */
	@CrossOrigin
	@RequestMapping("/update")
	public String updateUser(HttpServletRequest request){
		JSONObject json = new JSONObject();
		try {
			String token = request.getParameter("token");//token
			String nickName = request.getParameter("nickName");//昵称
			String email = request.getParameter("email");//邮箱
			String name = request.getParameter("name");//姓名
			String sex = request.getParameter("sex");//性别
			String birthday = request.getParameter("birthday");//出生日期
			String country = request.getParameter("country");//国家
			String province = request.getParameter("province");//省
			String city = request.getParameter("city");//市
			String county = request.getParameter("county");//区县
			String address = request.getParameter("address");//地址
			// 参数校验
			if(StringUtils.isEmpty(token)){
				logger.info(new StringBuffer().append("UserController updateUser token is ").append(token).toString());
				json.put("code", SystemStatusEnum.TOKEN_FAILURE.getValue());
				json.put("message", SystemStatusEnum.TOKEN_FAILURE.getName());
				return json.toString();
			}
			String isLogin = redis.opsForValue().get(token);
			if(StringUtils.isEmpty(isLogin)){
				json.put("code", SystemStatusEnum.TOKEN_FAILURE.getValue());
				json.put("message", SystemStatusEnum.TOKEN_FAILURE.getName());
				return json.toString();
			}
			BpUser user = userService.getByToken(token);
			if(user!=null){
				user.setNickName(nickName);
				user.setEmail(email);
				user.setName(name);
				if(StringUtils.isNotEmpty(sex)){
					user.setSex(sex);
				}
				if(StringUtils.isNotEmpty(birthday)){
					user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse(birthday));
				}
				user.setCountry(country);
				user.setProvince(province);
				user.setCity(city);
				user.setCounty(county);
				user.setAddress(address);
				userService.update(user);//完善用户信息
				
				json.put("code", SystemStatusEnum.SUCCESS.getValue());
				json.put("message", "修改"+SystemStatusEnum.SUCCESS.getName());
				return json.toString();
			} else {
				json.put("code", SystemStatusEnum.TOKEN_FAILURE.getValue());
				json.put("message", SystemStatusEnum.TOKEN_FAILURE.getName());
			}
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			json.put("code", SystemStatusEnum.SERVERERROR.getValue());
			json.put("message", SystemStatusEnum.SERVERERROR.getName());
		}
		return json.toString();
	}
	
	/**
	 * 密码重置
	 */
	@CrossOrigin
	@RequestMapping("/pwdReset")
	public String pwdReset(HttpServletRequest request){
		JSONObject json = new JSONObject();
		try {
			String validateCode = request.getParameter("validateCode");//验证码
			String phone = request.getParameter("phone");//手机号
			String newPwd = request.getParameter("newPwd");//新密码
			if(StringUtils.isEmpty(validateCode) || StringUtils.isEmpty(phone) || StringUtils.isEmpty(newPwd)){
				json.put("code", SystemStatusEnum.PARAMETER_CANNOT_BE_EMPTY.getValue());
				json.put("message", SystemStatusEnum.PARAMETER_CANNOT_BE_EMPTY.getName());
				return json.toString();
			}
			// 以“业务类型:手机号码:验证码”形式
			String validate = redis.opsForValue().get(ValidateCodeEnum.PWDRESET.getValue()+"-"+phone+"-"+validateCode);
			if(StringUtils.isNotEmpty(validate)){
				BpUser users = new BpUser();
				users.setPhone(phone);
				List<BpUser> userList = userService.findBySearch(users);
				if(userList.size()>0){
					BpUser user = userList.get(0);
					user.setPassword(newPwd);
					userService.update(user);
					
					json.put("code", SystemStatusEnum.SUCCESS.getValue());
					json.put("message", "密码重置"+SystemStatusEnum.SUCCESS.getName());
					redis.delete(ValidateCodeEnum.PWDRESET.getValue()+"-"+phone+"-"+validateCode);//删除密码重置验证码缓存
					return json.toString();
				} else {
					logger.info(new StringBuffer().append("UserController pwdReset phone is ").append(phone).toString());
					json.put("code", SystemStatusEnum.USER_IS_NULL.getValue());
					json.put("message", SystemStatusEnum.USER_IS_NULL.getName());
				}
			} else {
				json.put("code", SystemStatusEnum.VALIDATECODE_ERROR.getValue());
				json.put("message", SystemStatusEnum.VALIDATECODE_ERROR.getName());
			}
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			json.put("code", SystemStatusEnum.SERVERERROR.getValue());
			json.put("message", SystemStatusEnum.SERVERERROR.getName());
		}
		return json.toString();
	}

	/**
	 * 查看用户信息
	 * @param request
	 * @return
	 */
	@CrossOrigin
	@RequestMapping("/userInfo")
	public String userInfo(HttpServletRequest request) {
		JSONObject json = new JSONObject();
		try {
			String userId = request.getParameter("userId");
			if(StringUtils.isEmpty(userId)){
				json.put("code", SystemStatusEnum.PARAMETER_CANNOT_BE_EMPTY.getValue());
				json.put("message", SystemStatusEnum.PARAMETER_CANNOT_BE_EMPTY.getName());
				return json.toString();
			}

			json.put("data", getUserDetail(userService.getById(userId)));
			json.put("code", SystemStatusEnum.SUCCESS.getValue());
			json.put("message", SystemStatusEnum.SUCCESS.getName());
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			json.put("code", SystemStatusEnum.SERVERERROR.getValue());
			json.put("message", SystemStatusEnum.SERVERERROR.getName());
		}
		return json.toString();
	}

	/**
	 * 验证手机号是否存在
	 */
	private boolean phoneIsEmpty(String phone) {
		boolean isEmpty = false;
		BpUser user = new BpUser();
		user.setPhone(phone);
		user.setSymbol(CommonCode.Y.getValue());
		List<BpUser> userList = userService.findBySearch(user);
		if(userList!=null && userList.size() >0) {
			isEmpty = true;
		}
		return isEmpty;
	}
	
	/**
	 * 发送短信验证码
	 */
	private boolean sendSMS(String type, String phone) {
		boolean result = false;
		String validateCode = generatedCode();//验证码
		String content = "";//短信模板内容
		
		BpSms sms = new BpSms();
		sms.setPhone(phone);
		sms.setSmsType(type);
		sms.setContent(content + validateCode);
		sms.setServicer("阿里云短信服务");
		sms.setSendTime(new Date());
		
		JSONObject json = SendSmsUtil.sendSms(phone, validateCode);
		//{"Message":"OK","RequestId":"52C74D17-60B8-4BA9-A52D-20C073A774EC","BizId":"854310361792483517^0","Code":"OK"}
        sms.setResTime(new Date());
        sms.setResMessage(json.getString("Message"));
        if(json.getString("Code").equals("OK")) {
        	sms.setStatus("1");//  0未发送 1成功 2失败
        	result = true;
        } else {
        	sms.setStatus("2");//  0未发送 1成功 2失败
        }
        sms.setSymbol(CommonCode.Y.getValue());
        smsService.add(sms);
		
		// 以“业务类型-手机号码-验证码”形式存入缓存
		redis.opsForValue().set(type+"-"+phone+"-"+validateCode, validateCode, 5, TimeUnit.MINUTES);
		return result;
	}
	
	/**
	 * 生成6位随机数字
	 */
	private String generatedCode(){
		String code = "";
		for (int i = 0; i < 6; i++) {
			double a = Math.random() * 9 + 1;
			int s = (int) a;
			code += s;
		}
		return code;
	}
	
	/**
	 * 构建返回用户信息
	 */
	private UserVO getUserVO(BpUser user){
		UserVO vo = new UserVO();
		vo.setId(user.getId() == null ? "" : user.getId());//用户id
		vo.setUserPhoto(user.getUserPhoto() == null ? "" : user.getUserPhoto());//用户头像
		vo.setUserName(user.getUserName() == null ? "" : user.getUserName());//用户名
		vo.setNickName(user.getNickName() == null ? "" : user.getNickName());//昵称
		vo.setPhone(user.getPhone() == null ? "" : user.getPhone());//手机号码
		vo.setEmail(user.getEmail() == null ? "" : user.getEmail());//电子邮箱
		vo.setName(user.getName() == null ? "" : user.getName());//姓名
		vo.setSex(user.getSex() == null ? "" : user.getSex());//性别
		vo.setBirthday(user.getBirthday() == null ? null : user.getBirthday());//出生日期
		vo.setCountry(user.getCountry() == null ? "" : user.getCountry());//国家
		vo.setProvince(user.getProvince() == null ? "" : user.getProvince());//省
		vo.setCity(user.getCity() == null ? "" : user.getCity());//市
		vo.setCounty(user.getCounty() == null ? "" : user.getCounty());//区县
		vo.setAddress(user.getAddress() == null ? "" : user.getAddress());//地址
		vo.setUserType(user.getUserType() == null ? "" : user.getUserType());//用户类型 0游客 1普通用户 2会员
		vo.setRegisterType(user.getRegisterType() == null ? "" : user.getRegisterType());//注册类型 0管理员注册 1安卓系统注册 2IOS系统注册
		vo.setRegisterInvitationCode(user.getRegisterInvitationCode() == null ? "" : user.getRegisterInvitationCode());//注册邀请码
		vo.setRegisterTime(user.getRegisterTime());//注册时间
		vo.setToken(user.getToken() == null ? "" : user.getToken());//保持登录
		return vo;
	}

	/**
	 * 构建用户详情
	 * @param user
	 * @return
	 */
	private UserVO getUserDetail(BpUser user){
		UserVO vo = new UserVO();
		vo.setUserPhoto(user.getUserPhoto() == null ? "" : user.getUserPhoto());//用户头像
		vo.setNickName(user.getNickName() == null ? "" : user.getNickName());//昵称
		vo.setSex(user.getSex() == null ? "" : user.getSex());//性别
		vo.setBirthday(user.getBirthday() == null ? null : user.getBirthday());//出生日期
		vo.setCountry(user.getCountry() == null ? "" : user.getCountry());//国家
		vo.setProvince(user.getProvince() == null ? "" : user.getProvince());//省
		vo.setCity(user.getCity() == null ? "" : user.getCity());//市
		vo.setCounty(user.getCounty() == null ? "" : user.getCounty());//区县
		vo.setAddress(user.getAddress() == null ? "" : user.getAddress());//地址
		vo.setUserType(user.getUserType() == null ? "" : user.getUserType());//用户类型 0游客 1普通用户 2会员
		vo.setRegisterTime(user.getRegisterTime());//注册时间
		return vo;
	}
	
}
